package controller

import (
	"VideoManageSystem/internal/initConfig"
	"VideoManageSystem/internal/model"
	"VideoManageSystem/internal/service"
	"errors"

	"github.com/gin-gonic/gin"
	"github.com/google/uuid"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

// AddDepartment 添加部门
func AddDepartment(c *gin.Context) {
	var userInput struct {
		Name string `json:"name"`
	}

	if err := c.ShouldBindJSON(&userInput); err != nil {
		c.JSON(400, gin.H{
			"code":    400,
			"message": "请求参数错误；错误：" + err.Error(),
		})
		return
	}

	// 检查数据库中是否已有该部门
	isAlreadyExists, err := service.CheckDepartmentExist(userInput.Name)
	if err != nil {
		c.JSON(500, gin.H{
			"code":    500,
			"message": "服务器内部错误，无法添加指定部门，请稍后再试；错误：" + err.Error(),
		})
		return
	}
	if isAlreadyExists {
		c.JSON(403, gin.H{
			"code":    403,
			"message": "已添加过该部门",
		})
		return
	}

	newDepartment := model.Department{
		ID:   uuid.New().String(),
		Name: userInput.Name,
	}

	if err := service.CreateNewDepartment(newDepartment); err != nil {
		c.JSON(500, gin.H{
			"code":    500,
			"message": "服务器内部错误，无法添加指定部门，请稍后再试；错误：" + err.Error(),
		})
		return
	}

	c.JSON(200, gin.H{
		"code":    200,
		"message": "添加部门成功",
		"id":      newDepartment.ID,
	})
}

// DeleteDepartment 删除部门
func DeleteDepartment(c *gin.Context) {
	var userInput struct {
		ID string `json:"id"`
	}

	if err := c.ShouldBindJSON(&userInput); err != nil {
		c.JSON(400, gin.H{
			"code":    400,
			"message": "请求参数错误；错误：" + err.Error(),
		})
		return
	}

	// 调用服务层删除部门
	err := service.DeleteDepartmentByID(userInput.ID)
	if err != nil {
		switch {
		case errors.Is(err, gorm.ErrRecordNotFound):
			// 如果是记录未找到错误
			c.JSON(403, gin.H{
				"code":    403,
				"message": "该部门不存在",
			})
		case err.Error() == "该部门下仍有用户，不能删除":
			// 如果是部门下有用户关联的错误
			c.JSON(403, gin.H{
				"code":    403,
				"message": "该部门下仍有用户，不能删除",
			})
		default:
			// 其他服务器内部错误
			c.JSON(500, gin.H{
				"code":    500,
				"message": "服务器内部错误，无法删除指定部门，请稍后再试；错误：" + err.Error(),
			})
		}
		return
	}

	// 成功删除部门
	c.JSON(200, gin.H{
		"code":    200,
		"message": "删除指定部门成功",
	})
}

// GetDepartmentList 获取部门列表
func GetDepartmentList(c *gin.Context) {
	// 定义接收数据的结构体切片
	var departments []model.Department

	// 查询所有部门
	err := initConfig.GormDb.Find(&departments).Error
	if err != nil {
		zap.L().Error("获取部门列表失败", zap.Error(err))
		c.JSON(500, gin.H{
			"code":    500,
			"message": "服务器内部错误，无法获取部门列表，请稍后再试；错误：" + err.Error(),
		})
		return
	}

	// 成功返回结果
	c.JSON(200, gin.H{
		"code":    200,
		"message": "获取部门列表成功",
		"data":    departments,
	})
}
